#ifndef _PIN_DEF_H
#define _PIN_DEF_H

// pins
#define BUTTON_0   0
#define BUTTON_1   1
#define DIR2       2
#define STEP2      3
#define TMC2209_TX 4
#define TMC2209_RX 5
#define DIAG2      6
#define DIR3       7
#define STEP3      8
#define DIAG3      9
#define DIR1       10
#define STEP1      11
#define DIAG1      12
#define DIR0       13 
#define STEP0      14 
#define DIAG0      15 
#define ITR9606_0  16
#define ITR9606_1  17
#define ENN        18
#define LED        19
#define CAMERA_TX  28
#define CAMERA_RX  29

#define TMC2209_UART uart1
#define CAMERA_UART  uart0

// error code
#define ERROR_TMC2209_CONFIG_0 0
#define ERROR_TMC2209_CONFIG_1 1
#define ERROR_TMC2209_CONFIG_2 2
#define ERROR_TMC2209_CONFIG_3 3
#define ERROR_ZERO_POINT       4


// 每圈200步（360/1.8），16细分，每一分钟60秒
#define RPM (200.0f * 16.0f / 60.0f)
// 速度和加速度，先取比较保守的值
const float SPEED_HOME = 100.0f * RPM;
const float SPEED_LOW  = 200.0f * RPM;
const float ACCEL_HOME = 1e5f;
const float V_START_FINGER = 100.0f*RPM;     // 起跳速度
const float V_MAX_FINGER =   800.0f*RPM;     // 最大速度
const float A_MAX_FINGER =   2.5e6f;         // 最大加速度
const float V_START_ARM =    100.0f*RPM;
const float V_MAX_ARM =      300.0f*RPM;
const float A_MAX_ARM =      1e6f;
const float V_START_ARM_L =  50.0f*RPM;
const float V_MAX_ARM_L =    200.0f*RPM;
const float A_MAX_ARM_L =    0.3e6f;
const int DELAY_US_AFTER_FINGER_LOCK = 3000;

const float SPEED_FACTOR_FULL = 1.0f;
const float SPEED_FACTOR_SLOW = 0.125f;


// ARM_OFFSET 零点距离光电开关的角度，720 * (1.8 / 16) = 81度
#define ARM_OFFSET 720

// FINGER_OFFSET，每个微步代表8*1.5*2*pi/(200*16) = 3*pi/400 = 0.02356mm
// 手指原点，距离电机轴最近的位置
#define FINGER_OFFSET_ZERO       0
// 利用爪子的型变弹力，可以单臂夹紧魔方，不滑落的状态
// 如果夹不紧，还原过程中容易松动，导致魔方滑落，改小
// 如果夹的过紧，导致魔方滑落，容易丢步，改大
#define FINGER_OFFSET_LOCK       (FINGER_OFFSET_INIT-45)
// 利用爪子的型变弹力，可以拧动魔方的状态
#define FINGER_OFFSET_SPIN       (FINGER_OFFSET_INIT-20)
// 回零点后，需要手指移动到的位置，比较松，方便放置魔方
#define FINGER_OFFSET_INIT       230
// 允许的最远位置
#define FINGER_OFFSET_MAX        1300

/*
方向定义
FINGER_OFFSET_ZERO
DIR=0
  |
  |
  |
DIR=1
FINGER_OFFSET_MAX
*/

// 电机0 2
#define LEFT  0
// 电机1 3
#define RIGHT 1

#define CCW   0
#define CW    1

// IRUN IHOLD取值范围0-31
// Irms = (CS + 1)/32*180/(100+20)/sqrt(2)
// Ip   = (CS + 1)/32*180/(100+20)
// 电机厂商标称的最大电流,通常为峰值
// IRUN峰值1.17A, IHOLD峰值0.66A
#define IRUN  24
#define IHOLD 13
// SGTHRS 无限位归零阈值，数值越大，越容易触发
// 如果回零时有较大响声，改大
// 如果回零时提前停止，说明灵敏度过高，改小
#define SGTHRS 105
#endif
